// 引入 express 模块
const express = require('express');
// 创建 express 应用实例
const app = express();
// 定义服务器监听的端口号
const port = 3000;

/**
 * 中间件：设置 CORS 头，允许跨域请求
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件函数
 */
app.use((req, res, next) => {
  // 允许所有源访问服务器资源
  res.setHeader('Access-Control-Allow-Origin', '*'); 
  // 允许的 HTTP 方法
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  // 允许的请求头
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  // 调用下一个中间件
  next();
});

/**
 * 定义根路径的路由，返回一个简单的问候语
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
app.get('/', (req, res) => {
  // 向客户端发送响应消息
  res.send('Hello, World!');
});

/**
 * 定义 SSE 接口，用于向客户端实时发送消息
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
app.get('/sse', (req, res) => {
  // 设置响应头，指定内容类型为 text/event-stream，开启 SSE
  res.setHeader('Content-Type', 'text/event-stream');
  // 禁止缓存响应内容
  res.setHeader('Cache-Control', 'no-cache');
  // 保持连接处于活动状态
  res.setHeader('Connection', 'keep-alive');
  // 刷新响应头，将设置的头信息发送给客户端
  res.flushHeaders();

  // 每 300 毫秒向客户端发送一次消息
  const intervalId = setInterval(() => {
    // 构建要发送的消息，包含当前时间
    const message = `data: ${new Date().toLocaleTimeString()}\n\n`;
    // 向客户端发送消息
    res.write(message);
  }, 300);

  // 8 秒后断开与客户端的连接
  const disconnectTimeout = setTimeout(() => {
    // 清除消息发送的定时器
    clearInterval(intervalId);
    // 结束响应，断开连接
    res.end();
  }, 8000);

  // 监听客户端断开连接事件
  req.on('close', () => {
    // 清除消息发送的定时器
    clearInterval(intervalId);
    // 清除断开连接的定时器
    clearTimeout(disconnectTimeout);
  });
});

// 启动服务器，监听指定端口
app.listen(port, () => {
  // 服务器启动成功后，在控制台输出提示信息
  console.log(`Server is running on port ${port}`);
});